var express = require('express');
var utils = require('../functions/utils');

var async = require('async');
var facebookRequest = require("request");

var router = express.Router();

router.post('/', function(req,res)
{


/*
	Input parameters 
	 *		isLoginIdFromFacebook 옵션	 0: 입력받음 , 1 : 페이스북으로부터 요놈은 페이스북으로부터 이메일을 받았는지 여부 안받으면 앱에서 입력받음 
								( 왜필요한가하면 패스워드로긴아이디인데 같은 로긴아이디로 페이스북으로 로긴할 수도 있기때문. 그 경우 페이스북에서 온 이메일일경우는 로긴받아주는거고 입력받은 놈일 경우는 에러.)
	 *		loginId			옵션 - facebookid로만 핸들링한다. 
	 *		facebookId
	 *  	facebookToken
*/
	var isLoginIdFromFacebook = req.body.isLoginIdFromFacebook;	//utils.checkParamValue('isLoginIdFromFacebook' , isLoginIdFromFacebook);
	var loginId = req.body.loginId;				//utils.checkParamValue('loginId' , loginId);
	var facebookId = req.body.facebookId;		utils.checkParamValue('facebookId' , facebookId);
	var facebookToken = req.body.facebookToken;	utils.checkParamValue('facebookToken' , facebookToken);

	//console.log('[' +facebookId + '] , [' + facebookToken +']');

	// 금지어 체크
	utils.checkProhibitedWord(loginId);

	// 값이 넘어왔으면 trim
	if(loginId != null)
	{
		loginId = loginId.replace(/(^\s*)|(\s*$)/gi, "");
		// 길이가 없으면 null
		if(loginId.length == 0)
			loginId = null;
		// lower case 
		else
			loginId = loginId.toLowerCase();
	}

	// session id 없으니 loginId로 대신한다. 
	if(utils.isValidString(loginId))
	{
		req.body.sessionId = loginId;
	}
	else
	{
		req.body.sessionId = facebookId;
	}

	utils.callLog(req);

	var userName = null;
	var domain = null;

	var userKey = null;
	var result = null;

	// loginId가 입력되었을 경우...
	if(utils.isValidString(loginId))
	{
		// email check
		if(!utils.emailCheck(loginId))
		{
			var err = new Error('Invalid email address : ' + loginId);
			err.code = '524';
			throw err;
		}

		var _list = loginId.split("@");

		userName = _list[0];
		domain = _list[1];
	}

//////////////////////////////////////////////////////////////////////////////////


		async.waterfall([
			function(cb)
			{
				//fb id check
				// facebook invalidation
				var path = global.config.facebook.validation_page + facebookToken;
				// facebook restful api 
				facebookRequest(path, function (error, response, body) 
				{
					if (!error && response && response.statusCode && response.statusCode == 200) 
					{
						var data = JSON.parse(body);

						// 입력된 id와 실제 id가 다를 경우 
						if(facebookId != data.id)
						{
							var err = new Error('Facebook ID mismatch: input(' + facebookId +'), real(' + data.id+')');
							err.code = '550';
							throw err;
						}
						else
						{
							// next
							cb();
						}
					}
					else
					{
						var err = new Error('Invalid Facebook token : ' + facebookToken);
						err.code = '550';
						throw err;
					}

				}); // request facebook 
			},
			function(cb)
			{
				//  check and register : replica 에서 체크하면 replication lag 때문에 중복될 가능성때문에 몽땅 master 에서 처리한다.
				global.master_db.connection.getConnection(function(err,connection)
				{
					if(err)
					{
						throw err;
					}

					var input_param = [isLoginIdFromFacebook, loginId , facebookId ,userName];

					var sql = 'call api_checkAndLoginWithFacebook_1_0(? , ? , ?  , ? , @key , @result); SELECT @key as userKey , @result AS result';
					var query = connection.query(sql, input_param , function (err, rows) 
					{
						connection.release();
						if(err)
						{
							throw err;
						}

						userKey = rows[1][0].userKey;
						result = rows[1][0].result;

						// next 
						cb();

					}); // call api_checkAndLoginWithFacebook_1_0

				}); // getConnection
			},
			function(cb)
			{
				var ret = { 'body' : {} };	 // 기본값은 성공

				switch(result)
				{
					case 200:
					case 201:
					case 202:
						ret.code=result;
						ret.body.userKey=userKey;
						break;
					case 520:
						var err = new Error('Email is in use : ' + loginId);
						err.code = '520';
						throw err;
						break;
					case 551:
						var err = new Error('loginId and Facebook Id mismatch : ' + loginId + ',' + facebookId);
						err.code = '551';
						throw err;
						break;
					default:
						throw new Error();

				}

				res.json(ret);
				res.end();

			}

		]); // waterfall 

	
});

module.exports = router;